.TITLE XXFIN .IDENT /01.03/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; K. L. NOEL 24-MAR-87 ; ; MODIFIED FOR CPRSX V2.0 BY: ; ; Eric Postpischil 20-Oct-1989 1.03 ; edp076 Move processing for SF.GMC and SF.SMC from XXTTI to here. ; ; PAUL K. M. WEISS 3-AUG-1989 1.02 ; PKW183 - DON'T FILTER OUT IO.LOV AND IO.LDO FOR TERMINALS ; ; PAUL K. M. WEISS 22-JUN-1989 1.01 ; PKW181 - BUFFER ACP AND SMALL IO REQUEST IN CPRBUF ; ; I/O FINISHING MODULE FOR ALL REMOTE QIOS ; ; .PAGE ; ; LOCAL SYMBOL DEFINITION ; MAP5 = 120000 ; ADDRESS OF FIRST WORD IN APR5 MAP6 = 140000 ; ADDRESS OF FIRST WORD IN APR6 .PAGE ;+ ; ; I/O FUNCTION CODE DISPATCH TABLES ; ;- DSPTBL: .WORD DEAPKT ; 0 IO.KIL .WORD DEAPKT ; 1 IO.WLB .WORD FN1BF ; 2 IO.RLB .WORD DEAPKT ; 3 IO.ATT .WORD DEAPKT ; 4 IO.DET .WORD DEAPKT ; 5 ? .WORD DEAPKT ; 6 ? .WORD DEAPKT ; 7 ? .WORD 0 ;10-ILLEGAL FUNCTION .WORD FNACP ;11-FIND FILE NAME IN DIRECTORY .WORD FNACP ;12-UNLOCK BLOCK - NOP'D IN MASK .WORD FNACP ;13-REMOVE FILE NAME FROM DIRECTORY .WORD FNACP ;14-ENTER FILE NAME IN DIRECTORY .WORD FNACC ;15-ACCESS FILE FOR READ .WORD FNACC ;16-ACCESS FILE FOR READ AND WRITE .WORD FNACC ;17-ACCESS FILE FOR READ, WRITE, AND EXT .WORD FNDEA ;20-DEACCESS FILE .WORD FN1BF ;21-READ VIRTUAL BLOCK .WORD DEAPKT ;22-WRITE VIRTUAL BLOCK .WORD FNACP ;23-EXTEND FILE .WORD FNACP ;24-CREATE FILE .WORD FNACP ;25-MARK FILE FOR DELETE/TRUNCATE FILE .WORD FNACP ;26-READ FILE ATTRIBUTES .WORD FNACP ;27-WRITE FILE ATTRIBUTES .WORD FNACP ;30-USER MAGTAPE CONTROL FUNCTION .WORD DEAPKT ;31-TRANSMIT PROCESS MESSAGE .WORD DEAPKT ;32-RECEIVE PROCESS MESSAGE .WORD NTACC ;33-CONNECT TO PROCESS .WORD NTDEA ;34-DISCONNECT FROM PROCESS .WORD NCTSPL ;35-NETWORK CONTROL FUNCTION TTIDSP: .WORD 0 ;IO.KIL .WORD DEAPKT ;IO.WLB .WORD FN1BF ;IO.RLB .WORD DEAPKT ;IO.ATT .WORD DEAPKT ;IO.DET .WORD SPC ;SPECIAL FUNCTIONS: ; IO.GTS ; SF.SMC ; SF.GMC .WORD DEAPKT ;IO.HNG .WORD 0 ;RESERVED EXEC CLOSE-OUT-LUN FUNCTION .WORD 0 ;RESERVED FOR USER MODE DIAGNOSTICS .WORD FN1BF ;IO.RPR .WORD FN1BF ;IO.RTT .IF DF B$$MAP .WORD DEAPKT ;IO.WSD .WORD FN1BF ;IO.RSD .ENDC ;B$$MAP .WORD 0 ;IO.EIO .PAGE ; ; DISPATCH TO CORRECT FINISHING ROUTINE ; ; R0 IS ADDRESS OF CPR PACKET TO BE DEALLOCATED ; XXFIN:: SAVNR MOV R0,-(SP) ;SAVE CPR BUFFER ON STACK MOV I.TCB(R3),R4 ;GET TCB ADDRESS OF TASK MOV T.PCB(R4),R4 ;GET PCB ADDRESS MOV P.REL(R4),@#KISAR6 ;MAP HEADER MOVB I.FCN+1(R3),R2 ;RETRIEVE I/O FUNCTION CODE ASL R2 ;CONVERT TO WORD INDEX MOV I.LN2(R3),R4 ;GET POINTER TO SECOND LUN WORD BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE? BEQ 10$ ;IF EQ NO, USE DSPTBL JMP @TTIDSP(R2) ;EXECUTE FINISHING ROUTINE 10$: CMP #IO.LOV,I.FCN(R3);IS IT THE I-SPACE LOAD OVERLAY? BEQ DEAPKT ;IF EQ YES CMP #IO.LDO,I.FCN(R3);IS IT THE D-SPACE LOAD OVERLAY? BEQ DEAPKT ;IF EQ YES JMP @DSPTBL(R2) ;EXECUTE FINISHING ROUTINE NCTSPL: ; SPLIT NETWORK CONTROL FUNCTIONS. MOV I.FCN(R4),R1 ; GET FUNCTION CODE. BIC #177707,R1 ; EXTRACT THREE BITS INDICATING FUNCTION. ASR R1 ASR R1 JMP @NCTTBL(R1) ; DISPATCH. NCTTBL: .WORD NTACC ; 00, OPEN .WORD NTDEA ; 10, CLOSE .WORD DEAPKT ; 20, SPECIFY AST .WORD DEAPKT ; 30, GET NETWORK DATA .WORD DEAPKT ; 40, GET NETWORK DATA .WORD DEAPKT ; 50, GET NETWORK DATA .WORD DEAPKT ; 60 .WORD DEAPKT ; 70, GET LOCAL NODE INFORMATION ; ; PROCESS ACCESS OR DEACCESS ERROR FOR NETWORK. ; NTAERR: BIC #1,(R4) ; CLEAR INTERLOCK BIT, LEAVING SECOND LUN ; WORD UNCHANGED FROM ORIGINAL VALUE. ; ; COMPLETION FOR ALL ROUTINES - DEALLOCATE CPR BUFFER ; DEAPKT: MOV (SP)+,R0 ;RESTORE CPR PACKET BEQ 10$ ;IF NONE, EXIT MOV R3,-(SP) ;SAVE I/O PACKET CALL $CPDEA ;DEALLOCATE PACKET AND EXIT MOV (SP)+,R3 ;RESTORE I/O PACKET 10$: RETURN ; ; FN1BF - FINISH, RETURNING ONE BUFFER IF IT WAS KEPT IN CPRBUF ; FN1BF: CMP I.PRM(R3),(SP) ;WAS THE REQUEST BUFFERED? BNE DEAPKT ;BIAS NOT THE SAME, NOT BUFFERED MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS MOV I.PRM+4(R3),R0 ;LENGTH OF TRANSFER MOV 2(SP),R1 ;BIAS OF CPR PACKET MOV I.PRM+2(R3),R2 ;OFFSET TO BEGINNING OF BUFFER BIS #120000,R2 ;MAKE INTO APR5 OFFSET MOV R1,@#KISAR6 ;MAP CPR PACKET MOV MAP6+P$LUN+32,R3 ;BIAS OF USER BUFFER MOV MAP6+P$LUN+34,R4 ;OFFSET OF USER BUFFER CALL $BLXIO ;COPY THE BUFFER MOV (SP)+,R3 ;RESTORE I/O PACKET BR DEAPKT ;AND DEALLOCATE THE CPR PACKET ; ; NETWORK ACCESS AND DEACCESS STUBS. ; NTACC: TST 14(SP) ; DID ACCESS FAIL? BLT NTAERR ; YES, HANDLE ACCESS ERROR. MOV #$XXWIN,(R4) ; SET UP REFERENCE TO FAKE WINDOW BLOCK. BR DEAPKT NTDEA: TST 14(SP) ; DID ACCESS FAIL? BLT NTAERR ; YES, HANDLE ACCESS ERROR. CLR (R4) ; DELETE REFERENCE TO FAKE WINDOW BLOCK. MOV R3,-(SP) ; SAVE I/O PACKET ADDRESS. MOV R3,R1 ; PASS IT TO XXDET. MOV I.UCB(R3),R5 ; PASS UCB TO XXDET. JSR PC,XXDET ; CALL XXDET TO DELETE ACB, IF ANY. MOV (SP)+,R3 ; RESTORE I/O PACKET ADDRESS. BR DEAPKT ; ; PROCESS ACCESS OR DEACCESS ERROR FOR FILE ACCESS. ; FNAERR: BIC #1,(R4) ; CLEAR INTERLOCK BIT, LEAVING SECOND LUN ; WORD UNCHANGED FROM ORIGINAL VALUE. BR FNACP ; JOIN COMMON CODE. ; ; FINISH ACCESS FILE FUNCTION ; FNACC: TST 14(SP) ; DID ACCESS FAIL? BLT FNAERR ; YES, HANDLE ACCESS ERROR. MOV #$XXWIN,(R4) ;SET UP REFERENCE TO FAKE WINDOW BLOCK BR FNACP ;JOIN COMMON CODE ; ; FINISH DEACCESS FILE FUNCTIONS ; FNDEA: TST 14(SP) ; DID ACCESS FAIL? BLT FNAERR ; YES, HANDLE ACCESS ERROR. CLR (R4) ;DELETE REFERENCE TO FAKE WINDOW BLOCK ; ; FINSH ACP FUNCTION ; FNACP: MOV R3,-(SP) ;SAVE THE I/O PACKET ADDRESS MOV R3,R5 ;COPY I/O PACKET ADDRESS MOV I.PRM(R5),R3 ;IS THERE A BUFFER? BEQ ACPDON ;IF EQ NO MOV R3,@#KISAR6 ;MAP CPR BUFFER ; ; COPY FNB IF THERE IS ONE ; MOV I.PRM+16(R5),R4 ;GET OFFSET OF FNB BEQ COPFID ;IF EQ NONE MOV #15.*2,R0 ;GET LENGTH OF FNB CALL COPPRM ;COPY FNB INTO USER'S BUFFER ; ; COPY FID IF THERE IS ONE ; COPFID: TST I.PRM+2(R5) ;IS THERE A FID? BPL COPATR ;IF EQ NO MOV #3.*2,R0 ;LENGHT OF FID MOV #100,R4 ;OFFSET TO FID CALL COPPRM ;COPY FID BACK INTO USER'S BUFFER ; ; COPY UPDATED ATTRIBUTES ; COPATR: MOV I.PRM+6(R5),R1 ;GET OFFSET OF ATTRIBUTES BEQ ACPDON ;IF EQ NONE BIS #MAP6,R1 ;MAKE SURE IT'S A APR6 ADDRESS 10$: TSTB (R1) ;TEST ATTRIBUTE BEQ ACPDON ;IF EQ, NONE BGT 20$ ;IF GT ZERO, IT WAS A WRITE ATTRIBUTE MOV #512.,R0 ;ASSUME FULL SIZE CMP #366,(R1)+ ;IS THIS "READ ENTIRE FILE HEADER"? BEQ 11$ ;YES, CONTINUE MOVB -1(R1),R0 ;GET SIZE OF ATTRIBUTE 11$: CMP R0,$CPMXB ;IS IT TOO BIG BHI 30$ ;IF HI YES, DIRECT ACCESS ALREADY DONE TST (R1)+ ;SKIP PAST BIAS MOV (R1)+,R4 ;GET OFFSET TO ATTRIBUTE MOV R1,-(SP) ;SAVE POINTER TO ATTRIBUTE LIST CALL COPPRM ;COPY PARAMETER MOV (SP)+,R1 ;RESTORE POINTER BR 10$ ;GET NEXT ATTRIBUTE 20$: TST (R1)+ ;SKIP PAST TYPE AND LENGTH 30$: CMP (R1)+,(R1)+ ;SKIP PAST BIAS/OFFSET BR 10$ ;GET NEXT ATTRIBUTE ACPDON: MOV (SP)+,R3 ;RESTORE I/O PACKET JMP DEAPKT ; ; COPPRM - COPY PIECE OF CPR BUFFER BACK INTO USER'S ADDRESS SPACE ; ; INPUTS: R0 - LENGTH OF BUFFER IN BYTES ; R4 - OFFSET OF SOURCE BUFFER FROM TOP OF CPR BUFFER ; R5 - I/O PACKET ADDRESS ; USER ADDRESS MUST BE LOCATED AFTER THE INDICATED BUFFER ; ; OUTPUT: BUFFER IS COPIED ; COPPRM: MOV R0,-(SP) ;SAVE LENGTH ADD R4,R0 ;ADD OFFSET OF BUFFER INC R0 ;INC AND BIC TO... BIC #1,R0 ;ROUND TO NEXT WORD MOV MAP6(R0),R0 ;GET USER ADDRESS CALL $RELOC ;RELOCATE THE ADDRESS MOV R1,R3 ;OUTPUT BIAS MOV R4,R1 ;HOLD CPR PACKET OFFSET FOR A MOMENT MOV R2,R4 ;OUTPUT OFFSET MOV R1,R2 ;CPR PACKET OFFSET BIS #MAP5,R2 ;GET SOURCE OFFSET MOV I.PRM(R5),R1 ;GET SOURCE BIAS MOV (SP)+,R0 ;GET THE LENGTH CALLR $BLXIO ;PERFORM COPY AND RETURN ; ; SPC DOES SOME SPECIAL POST-PROCESSING FOR SF.GMC AND SF.SMC FUNCTIONS. ; WE LOOK THROUGH THE PORTION OF THE BUFFER THAT VMS SUCCESSFULLY PROCESSED ; TO FIND CHARACTERISTICS WHICH REQUIRE ADDITIONAL WORK FROM RSX. ; ; WE ASSUME ONLY CHARACTERISTICS WITH THE NORMAL TWO-BYTE FORMAT ARE ; SUCCESSFULLY PROCESSED BY VMS. THAT IS, THE ODDER CHARACTERISTICS WITH ; ADDITIONAL PARAMETERS ARE NOT IN THE PORTION OF THE BUFFER WE WILL SEE. ; IF THAT CHANGES, IT WILL BE NECESSARY TO IMPROVE THE SCANNING ALGORITHM. ; ; INPUT: ; R0 -- CPR PACKET ; R1 -- I/O PACKET ; THE I/O STATUS IN THE CPR PACKET MUST INCLUDE THE LENGTH PROCESSED ; IN THE SECOND WORD, WHETHER OR NOT AN ERROR OCCURRED. THE LENGTH ; MAY BE ZERO, BUT IT MUST BE CORRECT. ; ; OUTPUT: ; ON SF.SMC OPERATIONS, SLAVE AND SERIAL SETTINGS ARE ADJUSTED. ; ON SF.GMC OPERATIONS, THE PRIVILEGED STATUS IS FILLED IN. ; FN1BF IS CALLED FOR FINAL PROCESSING. ; SPC: CMP #SF.GMC,I.FCN(R3) ; IS THIS A GET CHARACTERISTICS? BEQ 10$ ; YES, WE WILL PROCESS IT. CMP #SF.SMC,I.FCN(R3) ; IS THIS A SET CHARACTERISTICS? BNE 90$ ; NO, WE WILL NOT PROCESS IT. 10$: MOV R5,-(SP) MOV R2,-(SP) MOV R0,-(SP) MOV @#KISAR6,-(SP) MOV R0,@#KISAR6 ; MAP THE CPR PACKET. MOV MAP6+H$STAT+2,R0 ; GET THE LENGTH FROM THE STATUS. MOV I.PRM(R3),@#KISAR6 ; MAP THE BUFFER. MOV I.PRM+2(R3),R2 ; GET THE OFFSET. BIS #MAP6,R2 ; ADJUST IT TO THE APR 6 REGION. MOV I.UCB(R3),R5 ; GET THE UCB. CMP #SF.GMC,I.FCN(R3) ; IS THIS A GET CHARACTERISTICS? BNE 20$ ; NO, GO ON. JSR PC,SCNGMC ; DO THE GMC-SPECIFIC SCAN. BR 30$ ; JOIN COMMON CODE. 20$: JSR PC,SCNSMC ; DO THE SMC-SPECIFIC SCAN. 30$: MOV (SP)+,@#KISAR6 MOV R0,(SP)+ MOV R2,(SP)+ MOV R5,(SP)+ 90$: CALLR FN1BF ; CALL FN1BF AND RETURN. ; ; SCNGMC SCANS A BUFFER OF TERMINAL CHARACTERISTICS AND PERFORMS ADJUSTMENTS ; NECESSARY TO COMPLETE AN SF.GMC OPERATION. ; ; SEE ASSUMPTION DESCRIBED IN SPC ROUTINE. ; ; INPUT: ; R0 -- LENGTH OF BUFFER ; R2 -- START OF BUFFER (WHICH IS, OF COURSE, CURRENTLY MAPPED) ; R5 -- UCB OF DEVICE SF.GMC WAS PERFORMED UPON ; ; OUTPUT: ; R0 -- ZERO ; R2 -- JUST BEYOND END OF BUFFER ; SCNGMC: ASR R0 ; CONVERT FROM BYTES TO NUMBER OF ; TERMINAL CHARACTERISTICS. BEQ 90$ ; IF ZERO, WE'RE DONE ALREADY. 10$: CMPB #TC.PRI,(R2) ; IS THIS THE PRIVILEGED CHARACTERISTIC? BNE 20$ ; NO, GO ON. CLRB 1(R2) ; ASSUME TERMINAL IS NOT PRIVILEGED. BIT #U2.PRV,U.CW2(R5) ; IS IT PRIVILEGED? BEQ 70$ ; NO, WE WERE CORRECT, GO ON. INCB 1(R2) ; YES, INDICATE THAT IN BUFFER. ; BR 70$ ; GO ON TO NEXT CHARACTERISTIC. 20$: 70$: ; END OF LOOP. TST (R2)+ ; ADVANCE TO NEXT CHARACTERISTIC. SOB R0,10$ ; CONTINUE IF THERE ARE MORE. 90$: RTS PC ; ; SCNSMC SCANS A BUFFER OF TERMINAL CHARACTERISTICS AND PERFORMS ADJUSTMENTS ; NECESSARY TO COMPLETE AN SF.SMC OPERATION. ; ; SEE ASSUMPTION DESCRIBED IN SPC ROUTINE. ; ; INPUT: ; R0 -- LENGTH OF BUFFER ; R2 -- START OF BUFFER (WHICH IS, OF COURSE, CURRENTLY MAPPED) ; R5 -- UCB OF DEVICE SF.SMC WAS PERFORMED UPON ; ; OUTPUT: ; R0 -- ZERO ; R2 -- JUST BEYOND END OF BUFFER ; SCNSMC: ASR R0 ; CONVERT FROM BYTES TO NUMBER OF ; TERMINAL CHARACTERISTICS. BEQ 90$ ; IF ZERO, WE'RE DONE ALREADY. 10$: CMPB #TC.TBM,(R2) ; IS THIS THE SERIAL CHARACTERISTIC? BNE 20$ ; NO, GO ON. TSTB 1(R2) ; DOES USER WANT TO TURN IT ON? BEQ 15$ ; NO, THEY WANT IT OFF. BIS #UM.SER,U.MUP(R5) ; OKAY, TURN IT ON. BR 70$ ; GO ON TO NEXT CHARACTERISTIC. 15$: BIT #1,U.LFLG(R5) ; IS SERIAL MODE BEING FORCED? BNE 70$ ; YES, WE MUST LEAVE IT ON. BIC #UM.SER,U.MUP(R5) ; NO, WE CAN TURN IT OFF. BR 70$ ; GO ON TO NEXT CHARACTERISTIC. 20$: CMPB #TC.SLV,(R2) ; IS THIS THE SLAVE CHARACTERISTIC? BNE 30$ ; NO, GO ON. TSTB 1(R2) ; DOES USER WANT TO TURN IT ON? BEQ 25$ ; NO, THEY WANT IT OFF. BIS #U2.SLV,U.CW2(R5) ; OKAY, TURN IT ON. BR 70$ ; GO ON TO NEXT CHARACTERISTIC. 25$: BIC #U2.SLV,U.CW2(R5) ; TURN IT OFF. ; BR 70$ ; GO ON TO NEXT CHARACTERISTIC. 30$: 70$: ; END OF LOOP. TST (R2)+ ; ADVANCE TO NEXT CHARACTERISTIC. SOB R0,10$ ; CONTINUE IF THERE ARE MORE. 90$: RTS PC .END